How ArrayList Works Internally